package com.cskaoyan.javase.oop1._11static._3usecase;

/**
 * 静态成员变量：
 * 属于全体对象所共享而不是独属于某个对象的成员变量，所以
 *      使用场景一：当存在需要所有对象共享的变量时，应该使用static
 *      使用场景二：不仅是全体对象共享的，而且是整个类全局独一份的（因为类加载只有一次）
 *
 * 静态成员方法：
 * 静态方法的最主要特点就是调用简单，无需创建对象即可调用，所以
 * 如果希望一个方法能够更方便快捷的去调用，可以把它声明为static修饰的静态成员方法
 * 实际上根据静态成员方法调用简单的特点，
 * 当一个类中全部都是静态成员方法时
 * 它的方法调用都可以使用类名点去完成，这就是Java当中的“工具类”
 * 比如数组工具类Arrays、集合工具类Collections、数学工具类Math等等 Objects对象工具类
 * 当然，静态成员方法也可以用来给静态成员变量赋值，这类似于用成员方法给成员变量赋值
 *
 * 实际上成员方法也是可以给静态成员变量赋值的，但是这种赋值依赖于创建对象，是比较少用的方式
 * @since 12:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Student s = new Student();
            System.out.println(s.id);
        }
        System.out.println(Student.count);
    }
}

class Student {
    int id;
    // 需求1,需要统计Student类在外部创建对象的次数，如何统计？
    /*
            统计创建对象的次数,肯定需要计数器
            这个计数器是一个变量
            这个变量应该是什么变量呢?
            这个变量应该不受创建对象的影响,应该类全局唯一
            所以它是一个静态成员变量
     */
    static int count = 0;
    // 需求2,学生有学号，这个学号是从88881开始，后面的学生+1，每个学生唯一
    /*
        这个学号首先有一个初始值是88881
        然后每创建一个对象都需要+1
        这个变量能够是一个成员变量吗?
        这应该是一个静态成员变量
     */
    static int initId = 88881;

    public Student() {
        count++;
        id = initId++;
    }

}
class A{

}